<?php
/**
 *
 * 图片处理类
 * @author kwor
 *
 */
class image_class
{
	var $saveName;
	var $savePath;
	var $smallsavePath;
	//上传设置
	var $upfile_size = 307200;  //上传文件大小
	var $upfile_type = array(
   'image/jpg', 
   'image/jpeg', 
   'image/png', 
   'image/pjpeg', 
   'image/gif', 
   'image/bmp', 
   'image/x-png'
   );

   //上传
   function upfile($fname,$savepath='',$hassmall=false,$smallsavepath='')
   {
   	//这里直接传图像数组，或函数获取
   	if(!is_array($fname)){
   		$file = $_FILES[$fname];
   	}else
   	{
   		$file = $fname;
   	}


   	if($file['size']>$this->upfile_size){return false;}//判断大小是否超过规定
   	if(!in_array($file['type'],$this->upfile_type)){return false;}//判断类型是否一致

   	$this->savePath=$this->cretepath($savepath);

   	//不存在就创建路径
   	if(!file_exists($this->savePath))
   	{
     $this->make_dir($this->savePath);
    }
    //获取要上传的文件名称
    $info = pathinfo($file['name']);
    //保存后的名称
    $this->saveName = time().rand(0,9999).".".$info['extension'];
    //移动文件到指定位置
    if(!move_uploaded_file ($file['tmp_name'],$this->savePath.$this->saveName))
    {
     return false;
    }

    if($hassmall==false){
    	$img="$this->savePath$this->saveName";
    }else{
    	$img['bigimg']="$this->savePath$this->saveName";
    	$this->smallsavePath=$this->cretepath($smallsavepath);
    	$img['smallimg']= $this->make_thumb("$this->savePath$this->saveName",$this->saveName,$this->smallsavePath,200,100);
    }
    return $img;

   }


   /**
    * 创建图片的缩略图
    *
    * @access  public
    * @param   string      $img    原始图片的路径
    * @param   int         $thumb_width  缩略图宽度
    * @param   int         $thumb_height 缩略图高度
    * @param   strint      $path         指定生成图片的目录名
    * @return  mix         如果成功返回缩略图的路径，失败则返回false
    */
   function make_thumb($img,$smallfilename, $path = '', $thumb_width = 0, $thumb_height = 0, $bgcolor='')
   {
   	$gd = $this->gd_version(); //获取 GD 版本。0 表示没有 GD 库，1 表示 GD 1.x，2 表示 GD 2.x
   	if ($gd == 0)
   	{
   		return false;  //不能创建，直接返回false
   	}

   	/* 检查缩略图宽度和高度是否合法 */
   	if ($thumb_width == 0 && $thumb_height == 0)
   	{
   		return str_replace(ROOT_PATH, '', str_replace('\\', '/', realpath($img)));
   	}

   	/* 检查原始文件是否存在及获得原始文件的信息 */
   	$org_info = @getimagesize($img);
   	if (!$org_info)  //文件信息不存在返回false
   	{
   		return false;
   	}

   	if (!$this->check_img_function($org_info[2]))
   	{
   		return false;
   	}

   	$img_org = $this->img_resource($img, $org_info[2]);

   	/* 原始图片以及缩略图的尺寸比例 */
   	$scale_org      = $org_info[0] / $org_info[1];
   	/* 处理只有缩略图宽和高有一个为0的情况，这时背景和缩略图一样大 */
   	if ($thumb_width == 0)
   	{
   		$thumb_width = $thumb_height * $scale_org;
   	}
   	if ($thumb_height == 0)
   	{
   		$thumb_height = $thumb_width / $scale_org;
   	}

   	/* 创建缩略图的标志符 */
   	if ($gd == 2)
   	{
   		$img_thumb  = imagecreatetruecolor($thumb_width, $thumb_height);
   	}
   	else
   	{
   		$img_thumb  = imagecreate($thumb_width, $thumb_height);
   	}

   	/* 背景颜色 */
   	if (empty($bgcolor))
   	{
   		$bgcolor = $this->bgcolor;
   	}
   	$bgcolor = trim($bgcolor,"#");
   	sscanf($bgcolor, "%2x%2x%2x", $red, $green, $blue);
   	$clr = imagecolorallocate($img_thumb, $red, $green, $blue);
   	imagefilledrectangle($img_thumb, 0, 0, $thumb_width, $thumb_height, $clr);

   	if ($org_info[0] / $thumb_width > $org_info[1] / $thumb_height)
   	{
   		$lessen_width  = $thumb_width;
   		$lessen_height  = $thumb_width / $scale_org;
   	}
   	else
   	{
   		/* 原始图片比较高，则以高度为准 */
   		$lessen_width  = $thumb_height * $scale_org;
   		$lessen_height = $thumb_height;
   	}

   	$dst_x = ($thumb_width  - $lessen_width)  / 2;
   	$dst_y = ($thumb_height - $lessen_height) / 2;

   	/* 将原始图片进行缩放处理 */
   	if ($gd == 2)
   	{
   		imagecopyresampled($img_thumb, $img_org, $dst_x, $dst_y, 0, 0, $lessen_width, $lessen_height, $org_info[0], $org_info[1]);
   	}
   	else
   	{
   		imagecopyresized($img_thumb, $img_org, $dst_x, $dst_y, 0, 0, $lessen_width, $lessen_height, $org_info[0], $org_info[1]);
   	}

   	/* 创建当月目录 */
   	if (!empty($path))
   	{

   		$dir = $path;
   	}else{

   		return false;
   	}


   	/* 如果目标目录不存在，则创建它 */
   	if (!file_exists($dir))
   	{
   		if (!$this->make_dir($dir))
   		{
   			return false;
   		}
   	}

   	/* 如果文件名为空，生成不重名随机文件名 */
   	$filename = $smallfilename;

   	/* 生成文件 */
   	 
   	if (function_exists('imagejpeg'))
   	{
   		imagejpeg($img_thumb, $dir . $filename);
   	}
   	elseif (function_exists('imagegif'))
   	{
   		imagegif($img_thumb, $dir . $filename);
   	}
   	elseif (function_exists('imagepng'))
   	{
   		imagepng($img_thumb, $dir . $filename);
   	}
   	else
   	{
   		return false;
   	}

   	//imagepng($img_thumb, $dir ."/". $filename);
   	imagedestroy($img_thumb);
   	imagedestroy($img_org);

   	//确认文件是否生成
   	if (file_exists($dir . $filename))
   	{
   		return $dir . $filename;
   	}
   	else
   	{
   		return false;
   	}
   }




   /**
    * 检查目标文件夹是否存在，如果不存在则自动创建该目录
    *
    * @access      public
    * @param       string      folder     目录路径。不能使用相对于网站根目录的URL
    *
    * @return      bool
    */
   function make_dir($folder)
   {
    $reval = false;

    if (!file_exists($folder))
    {
    	/* 如果目录不存在则尝试创建该目录 */
    	@umask(0);

    	/* 将目录路径拆分成数组 */
    	preg_match_all('/([^\/]*)\/?/i', $folder, $atmp);

    	/* 如果第一个字符为/则当作物理路径处理 */
    	$base = ($atmp[0][0] == '/') ? '/' : '';

    	/* 遍历包含路径信息的数组 */
    	foreach ($atmp[1] AS $val)
    	{
    		if ('' != $val)
    		{
    			$base .= $val;

    			if ('..' == $val || '.' == $val)
    			{
    				/* 如果目录为.或者..则直接补/继续下一个循环 */
    				$base .= '/';

    				continue;
    			}
    		}
    		else
    		{
    			continue;
    		}

    		$base .= '/';

    		if (!file_exists($base))
    		{
    			/* 尝试创建目录，如果创建失败则继续循环 */
    			if (@mkdir(rtrim($base, '/'), 0777))
    			{
    				@chmod($base, 0777);
    				$reval = true;
    			}
    		}
    	}
    }
    else
    {
    	/* 路径已经存在。返回该路径是不是一个目录 */
    	$reval = is_dir($folder);
    }

    clearstatcache();

    return $reval;
   }


   /**
    * 获得服务器上的 GD 版本
    *
    * @access      public
    * @return      int         可能的值为0，1，2
    */
   function gd_version()
   {
   	static $version = -1;

   	if ($version >= 0)
   	{
   		return $version;
   	}

   	if (!extension_loaded('gd'))
   	{
   		$version = 0;
   	}
   	else
   	{
   		// 尝试使用gd_info函数
   		if (PHP_VERSION >= '4.3')
   		{
   			if (function_exists('gd_info'))
   			{
   				$ver_info = gd_info();
   				preg_match('/\d/', $ver_info['GD Version'], $match);
   				$version = $match[0];
   			}
   			else
   			{
   				if (function_exists('imagecreatetruecolor'))
   				{
   					$version = 2;
   				}
   				elseif (function_exists('imagecreate'))
   				{
   					$version = 1;
   				}
   			}
   		}
   		else
   		{
   			if (preg_match('/phpinfo/', ini_get('disable_functions')))
   			{
   				/* 如果phpinfo被禁用，无法确定gd版本 */
   				$version = 1;
   			}
   			else
   			{
   				// 使用phpinfo函数
   				ob_start();
   				phpinfo(8);
   				$info = ob_get_contents();
   				ob_end_clean();
   				$info = stristr($info, 'gd version');
   				preg_match('/\d/', $info, $match);
   				$version = $match[0];
   			}
   		}
   	}

   	return $version;
   }


   /**
    * 根据来源文件的文件类型创建一个图像操作的标识符
    *
    * @access  public
    * @param   string      $img_file   图片文件的路径
    * @param   string      $mime_type  图片文件的文件类型
    * @return  resource    如果成功则返回图像操作标志符，反之则返回错误代码
    */
   function img_resource($img_file, $mime_type)
   {
   	switch ($mime_type)
   	{
   		case 1:
   		case 'image/gif':
   			$res = imagecreatefromgif($img_file);
   			break;

   		case 2:
   		case 'image/pjpeg':
   		case 'image/jpeg':
   			$res = imagecreatefromjpeg($img_file);
   			break;

   		case 3:
   		case 'image/x-png':
   		case 'image/png':
   			$res = imagecreatefrompng($img_file);
   			break;

   		default:
   			return false;
   	}

   	return $res;
   }




   /**
    * 检查图片处理能力
    *
    * @access  public
    * @param   string  $img_type   图片类型
    * @return  void
    */
   function check_img_function($img_type)
   {
   	switch ($img_type)
   	{
   		case 'image/gif':
   		case 1:

   			if (PHP_VERSION >= '4.3')
   			{
   				return function_exists('imagecreatefromgif');
   			}
   			else
   			{
   				return (imagetypes() & IMG_GIF) > 0;
   			}
   			break;

   		case 'image/pjpeg':
   		case 'image/jpeg':
   		case 2:
   			if (PHP_VERSION >= '4.3')
   			{
   				return function_exists('imagecreatefromjpeg');
   			}
   			else
   			{
   				return (imagetypes() & IMG_JPG) > 0;
   			}
   			break;

   		case 'image/x-png':
   		case 'image/png':
   		case 3:
   			if (PHP_VERSION >= '4.3')
   			{
   				return function_exists('imagecreatefrompng');
   			}
   			else
   			{
   				return (imagetypes() & IMG_PNG) > 0;
   			}
   			break;

   		default:
   			return false;
   	}
   }




   //创建上传目录
   function cretepath($path) {
   	if($path==''){
   		$path = date("Ymd")."/";
   	}else {
   		$path = $path."/".date("Ymd")."/";
   	}

   	return $path;
   }


    

}
?>